package com.haierp.service.impl;

import java.util.Date;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.eclipse.jetty.util.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.framework.service.impl.SuperServiceImpl;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.haierp.mapper.FindItemSkuMapper;
import com.haierp.model.FindItemSku;
import com.haierp.model.Inventory;
import com.haierp.service.IFindItemSkuService;
import com.haierp.service.IInventoryService;
import com.haierp.util.JsonPageResult;
import com.haierp.vo.ItemSkuQueryVO;
import com.haierp.vo.json.PicModel;
import com.wangzhixuan.commons.utils.HaiJsonUtils;

@Service("findItemSkuService")
public class FindItemSkuServiceImpl extends SuperServiceImpl<FindItemSkuMapper, FindItemSku>  implements IFindItemSkuService {
	
	@Autowired
	private IInventoryService inventoryService;

	@Override
	public JsonPageResult<List<FindItemSku>> queryFindItemSkus(ItemSkuQueryVO itemSkuQueryVO) {
		JsonPageResult<List<FindItemSku>> itemResult = new JsonPageResult<>();
		//1、查询总的记录数量
		Integer totalCount =  this.baseMapper.queryItemSkusCount(itemSkuQueryVO);
		
		//2、查询分页记录
		if(totalCount!=null&&totalCount!=0L){
			itemResult.buildPage(totalCount, itemSkuQueryVO);
			List<FindItemSku> itemSkus = this.baseMapper.queryItemSkus(itemSkuQueryVO);
			itemResult.setData(itemSkus);
		}
		return itemResult;
	}

	@Override
	public List<Inventory> initInventory(List<FindItemSku> itemSkuList) {
		List<Inventory> inventoryList = null;
		if (CollectionUtils.isNotEmpty(itemSkuList)) {
			inventoryList = Lists.transform(itemSkuList, new Function<FindItemSku, Inventory>() {
				@Override
				public Inventory apply(FindItemSku itemSku) {
					// 初始化库存信息
					Inventory inventory = new Inventory();
					inventory.setGmtCreate(new Date());
					inventory.setGmtModify(new Date());
					inventory.setItemId(itemSku.getItemId());
					inventory.setItemName(itemSku.getItemName());
					inventory.setInventory(0);
					inventory.setLockedInv(0);
					inventory.setTransInv(0);
					if (itemSku.getVirtualInv() > 0) {
						inventory.setVirtualInv(itemSku.getVirtualInv());
					} else {
						inventory.setVirtualInv(0);
					}
					inventory.setSkuId(itemSku.getId());
					inventory.setSkuCode(itemSku.getSkuCode());
					inventory.setUpc(itemSku.getUpc());
					return inventory;
				}
			});
		}
		return inventoryList;
	}

	@Override
	public void addFindItemSku(FindItemSku itemSku) {
		this.baseMapper.insert(itemSku);
		Inventory inventory = inventoryService.queryInventoryBySkuId(itemSku.getItemId(), itemSku.getId());
		if(inventory==null){
			List<FindItemSku> newInvList = Lists.newArrayList();
			newInvList.add(itemSku);
			List<Inventory>  inventoryList = initInventory(newInvList);
			inventoryService.insertBatch(inventoryList);
		}else{
			if(inventory.getVirtualInv()!=itemSku.getVirtualInv()){
				inventory.setVirtualInv(itemSku.getVirtualInv());
				inventory.setGmtModify(new Date());
				inventoryService.updateById(inventory);
			}
		}
	}


	@Override
	public void updateFindItemSku(FindItemSku itemSku) {
		this.baseMapper.updateSelectiveById(itemSku);
		Inventory inventory = inventoryService.queryInventoryBySkuId(itemSku.getItemId(), itemSku.getId());
		if(inventory==null){
			List<FindItemSku> newInvList = Lists.newArrayList();
			newInvList.add(itemSku);
			List<Inventory>  inventoryList = initInventory(newInvList);
			inventoryService.insertBatch(inventoryList);
		}else{
			if(inventory.getVirtualInv()!=itemSku.getVirtualInv()){
				inventory.setVirtualInv(itemSku.getVirtualInv());
				inventory.setGmtModify(new Date());
				inventoryService.updateById(inventory);
			}
		}
	}

	@Override
	public List<FindItemSku> queryFindItemSkusByItemId(Long itemId) {
		if(itemId!=null){
			return this.baseMapper.queryItemSkusById(itemId,null); 
		}
		return null;
	}
	
	@Override
	public Integer queryMaxSkuCodeIndex(Long itemId) {
		return this.baseMapper.queryMaxSkuCodeIndex(itemId);
	}

	@Override
	public FindItemSku queryFindItemSkusBySkuId(Long skuId) {
		if(skuId!=null){
			List<FindItemSku>  itemSkus = this.baseMapper.queryItemSkusById(null,skuId);
			if(CollectionUtils.isNotEmpty(itemSkus)){
				return itemSkus.get(0);
			}
			return null; 
		}
		return null;
	}
	
	@Override
	public void deleteSkuById(Long skuId) {
		if(isCanDeleteSku(skuId)) {
			this.baseMapper.deleteById(skuId);
			inventoryService.deleteInventoryBySkuId(skuId);
		}
	}
	
	@Override
	public boolean isCanDeleteSku(Long skuId) {
		if(skuId!=null) {
			Integer  o = this.baseMapper.queryItemSkusCountInOrder(skuId);
			if(o !=null && o>0) return false;
			
			Integer i = this.baseMapper.queryItemSkusCountInInventoryArea(skuId);
			if(i !=null && i>0) return false;
			
			Integer t = this.baseMapper.queryItemSkusCountInTask(skuId);
			if(t !=null && t>0) return false;
			
			Integer p = this.baseMapper.queryItemSkusCountInPurchase(skuId);
			if(p !=null && p>0) return false;
			
			return true;
		}
		return false;
	}
	
	@Override
	public FindItemSku queryFindItemSkuById(Long skuId) {
		return this.baseMapper.queryItemSkuById(skuId);
	}
	
	@Override
	public JsonPageResult<List<FindItemSku>> queryItemSkusByPurchaseStatus(ItemSkuQueryVO itemSkuQueryVO) {
		JsonPageResult<List<FindItemSku>> itemResult = new JsonPageResult<>();
		//1、查询总的记录数量
		Integer totalCount =  this.baseMapper.queryItemSkusByPurchaseStatusCount(itemSkuQueryVO);
		//2、查询分页记录
		if(totalCount!=null&&totalCount!=0L){
			itemResult.buildPage(totalCount, itemSkuQueryVO);
			List<FindItemSku> itemSkus = this.baseMapper.queryItemSkusByPurchaseStatus(itemSkuQueryVO);
			for (FindItemSku itemSku : itemSkus) {
				if(StringUtil.isNotBlank(itemSku.getSkuPic())) {
					PicModel pm = HaiJsonUtils.toBean(itemSku.getSkuPic(), PicModel.class);
	    			String imgSrc = pm.getPicList().get(0).getUrl();
	    			itemSku.setSkuPic(imgSrc);
				}
			}
			itemResult.setData(itemSkus);
		}
		return itemResult;
	}

}
